/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sgsmcan.Controlador;

import com.sgsmcan.Dao.PerroDao;
import com.sgsmcan.Dao.PerroDaoImpl;
import com.sgsmcan.Dao.SerenoDao;
import com.sgsmcan.Dao.SerenoDaoImpl;
import com.sgsmcan.Dao.SerenoPerroDao;
import com.sgsmcan.Dao.SerenoPerroImpl;
import com.sgsmcan.Entidad.Perro;
import com.sgsmcan.Entidad.Sereno;
import com.sgsmcan.Entidad.SerenoPerro;
import com.sgsmcan.Entidad.SerenoPerroId;
import com.sgsmcan.Hibernate.HibernateUtil;
import com.sgsmcan.Utils.Paginacion;
import com.sgsmcan.Utils.Utilitario;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.NavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author GOMEZ
 */
@ManagedBean(name = "serenoPerroBean")
@ViewScoped
public class SerenoPerroControlador implements Serializable {

    /**
     * Creates a new instance of SerenoPerroControlador
     */
    Sereno sereno;
    Perro perro;

    Sereno sereno2;
    Perro perro2;

    SerenoPerroDao sd;

    boolean estadoupdate;
    private List<Sereno> lstSerenos;
    private List<Perro> lstPerros;

    private List<Sereno> lstSerenosu;
    private List<Perro> lstPerrosu;

    private LazyDataModel<SerenoPerro> serenosperros;

    SerenoPerro sp;
    SerenoPerro spcaptura;
    SerenoPerro sp2;
    SerenoPerro spcap;

    SerenoDao serenoDao;
    PerroDao perroDao;

    String nombreSereno;
    String nombrePerro;

    public SerenoPerroControlador() {
        sereno = new Sereno();
        perro = new Perro();

        sereno2 = new Sereno();
        perro2 = new Perro();

        lstSerenos = new SerenoDaoImpl().getSerenos2();
        lstPerros = new PerroDaoImpl().getPerrosss();

        sd = new SerenoPerroImpl();
        sp = new SerenoPerro();
        sp2 = new SerenoPerro();
        spcaptura = new SerenoPerro();
        spcap = new SerenoPerro();

        lstSerenosu = new SerenoDaoImpl().getSerenoUpdate();
        lstPerrosu = new PerroDaoImpl().getPerroUpdate();

        serenoDao = new SerenoDaoImpl();
        perroDao = new PerroDaoImpl();
    }

    public void initLista() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            serenosperros = new Paginacion<SerenoPerro>(sd.getSerenoPerro());
        }
    }

    public void initUpdate() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = Utilitario.getFlash("idSereno");
            if (parametro == null) {
                FacesContext fc = FacesContext.getCurrentInstance();
                NavigationHandler nh = fc.getApplication().getNavigationHandler();
                nh.handleNavigation(fc, null, "/views/serenoperro/list.xhtml?faces-redirect=true");
            }
            SerenoPerroId id = (SerenoPerroId) parametro;
            int idPerro = id.getPerro().getId();
            int idSereno = id.getSereno().getId();
            sp = sd.getSerenoPerroid(idSereno, idPerro);

            lstSerenosu = new SerenoDaoImpl().getSerenoUpdate();
            lstPerrosu = new PerroDaoImpl().getPerroUpdate();
            sereno = sp.getSereno();
            perro = sp.getPerro();
        }
    }

    public void insertaSerernoPerro(ActionEvent evt) {

        if (nombreSereno.isEmpty() && nombrePerro.isEmpty()) {
            Utilitario.enviarMensajeGlobalError("Ingresar el nombre del sereno y del can a asignar");
            return;
        }

        if (nombreSereno.isEmpty()) {
            Utilitario.enviarMensajeGlobalError("Por favor ingrese el nombre de un sereno a asignar");
            return;
        }
        if (nombrePerro.isEmpty()) {
            Utilitario.enviarMensajeGlobalError("Por favor ingrese el nombre de un can a asignar");
            return;
        }

        if (!Utilitario.esSoloLetras(nombrePerro) || !Utilitario.esSoloLetras(nombreSereno)) {
            Utilitario.enviarMensajeGlobalError("Por favor, ingresar caracteres alfabéticos en los campos de texto");
            return;
        }

        if (nombreSereno.length() > 140) {
            Utilitario.enviarMensajeGlobalError("El número de caracteres ingresados supera al número de caracteres permitidos");
            return;
        }

        if (nombrePerro.length() > 100) {
            Utilitario.enviarMensajeGlobalError("El nombre del can digitado supera el rango de caracteres permitidos");
            return;
        }

////        
////        if (cuentaSerenoPerro(sereno.getId(), perro.getId()) == 1) {
////            Utilitario.enviarMensajeGlobalError("Esta asignación ya existe");
////            return;
////        }
//        if (cuentaPerrosporSereno(perro.getId()) == 1) {
//            
//            Utilitario.enviarMensajeGlobalError("Este perro ya fue asignado");
//            return;
//        }
        try {
//            if (cuentaSerenoPerroDesasignada(sereno.getId(), perro.getId()) == 1) {
//                sd.reasignar(sereno, perro);
//                sp = new SerenoPerro();
//            } else {}

            sd.insertarSerenoPerro(serenoDao.getSereno(serenoDao.getSerenoId(nombreSereno)), perroDao.getPerro(perroDao.getPerroId(nombrePerro)));

            lstSerenos = new SerenoDaoImpl().getSerenos2();
            lstPerros = new PerroDaoImpl().getPerrosss();
            sp = new SerenoPerro();
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error al insertar los datos");
            return;
        }

        Utilitario.enviarMensajeGlobalValido("Se ha ingresado correctamente");
    }

    public void eliminarSerenoPerro(ActionEvent evt) {
        SerenoPerroDao spdao = new SerenoPerroImpl();
        spdao.eliminarSerenoPerro(spcaptura);
        serenosperros = new Paginacion<SerenoPerro>(spdao.getSerenoPerro());
        lstSerenos = new SerenoDaoImpl().getSerenos2();
        lstPerros = new PerroDaoImpl().getPerrosss();
    }

    public String irActualizar(SerenoPerroId id) {
        Utilitario.putFlash("idSereno", id);
        return "updateSerenoPerro";
    }

    public void actualizarSerenoPerro(ActionEvent evt) {

        SerenoPerroDao sd2 = new SerenoPerroImpl();
        spcap = sd2.getSerenoPerroid(sereno.getId(), perro.getId());

        if (sereno.getId() == 0 && perro.getId() == 0) {
            Utilitario.enviarMensajeGlobalError("Por favor seleccione un sereno y un perro a asignar");
            return;
        }

        if (sereno.getId() == 0) {
            Utilitario.enviarMensajeGlobalError("Por favor seleccione un sereno a asignar");
            return;
        }

        if (perro.getId() == 0) {
            Utilitario.enviarMensajeGlobalError("Por favor seleccione un perro a asignar");
            return;
        }

        if (cuentaSerenoPerro(sereno.getId(), perro.getId()) == 1) {
            Utilitario.enviarMensajeGlobalError("Esta asignación ya existe");
            return;
        }

        sd2.actualizarSerenoPerro(spcap, sereno, perro);
        serenosperros = new Paginacion<SerenoPerro>(sd2.getSerenoPerro());
        lstSerenos = new SerenoDaoImpl().getSerenos2();
        lstPerros = new PerroDaoImpl().getPerrosss();
        spcap = new SerenoPerro();

        Utilitario.enviarMensajeGlobalValido("Asignacion Modificada Correctamente");
    }

    public int cuentaSerenoPerro(int serenoid, int perroid) {
        int i = 0;

        try {
            Session sesion = HibernateUtil.getSessionFactory().openSession();
            Query query = sesion.createQuery("SELECT PE FROM SerenoPerro AS PE WHERE PE.spk.sereno.id = :ids AND PE.spk.perro.id = :idp AND PE.estado = 1");
            query.setString("ids", Integer.toString(serenoid));
            query.setString("idp", Integer.toString(perroid));
            i = query.list().size();

            sesion.close();
        } catch (HibernateException e) {

        } finally {

        }
        return i;
    }

    public int cuentaPerrosporSereno(int perroid) {
        int i = 0;

        try {
            Session sesion = HibernateUtil.getSessionFactory().openSession();
            Query query = sesion.createQuery("from SerenoPerro where idPerro = :idp");
            query.setString("idp", Integer.toString(perroid));
            i = query.list().size();

            sesion.close();
        } catch (HibernateException e) {

        } finally {

        }
        return i;
    }

    public int cuentaSerenoPerroDesasignada(int serenoid, int perroid) {
        int i = 0;

        try {
            Session sesion = HibernateUtil.getSessionFactory().openSession();
            Query query = sesion.createQuery("SELECT PE FROM SerenoPerro AS PE WHERE PE.spk.sereno.id = :ids AND PE.spk.perro.id = :idp AND PE.estado = 0");
            query.setString("ids", Integer.toString(serenoid));
            query.setString("idp", Integer.toString(perroid));
            i = query.list().size();

            sesion.close();
        } catch (HibernateException e) {

        } finally {

        }
        return i;
    }

    public List<String> completeText(String query) {
        List<String> complete = serenoDao.autoComplete(query);
        List<String> muestra = new ArrayList();
        for (int i = 0; i < complete.size(); i++) {

            muestra.add(complete.get(i));
        }

        return muestra;
    }

    public List<String> completeTextPerro(String query) {
        List<String> complete = perroDao.autocomplete(query);
        List<String> muestra = new ArrayList();
        for (int i = 0; i < complete.size(); i++) {
            muestra.add(complete.get(i));
        }
        return muestra;
    }

    public List<Sereno> completar(String query) {
        List<Sereno> complete = serenoDao.autocompletar(query);
        List<Sereno> muestra = new ArrayList<Sereno>();
        for (int i = 0; i < muestra.size(); i++) {
            Sereno sereno1 = complete.get(i);
            muestra.add(sereno1);
        }

        return muestra;
    }

    public List<Perro> completarPerro(String query) {

        List<Perro> complete = perroDao.autocompletar(query);
        List<Perro> muestra = new ArrayList<Perro>();
        for (int i = 0; i < muestra.size(); i++) {
            Perro perros = complete.get(i);
            muestra.add(perros);
        }

        return muestra;
    }

    public void captura(int idsereno, int idperro) {
        spcaptura = new SerenoPerroImpl().getSerenoPerroid(idsereno, idperro);
    }

    public Sereno getSereno() {
        return sereno;
    }

    public void setSereno(Sereno sereno) {
        this.sereno = sereno;
    }

    public Perro getPerro() {
        return perro;
    }

    public void setPerro(Perro perro) {
        this.perro = perro;
    }

    public SerenoPerroDao getSd() {
        return sd;
    }

    public void setSd(SerenoPerroDao sd) {
        this.sd = sd;
    }

    public List<Perro> getLstPerros() {
        return lstPerros;
    }

    public void setLstPerros(List<Perro> lstPerros) {
        this.lstPerros = lstPerros;
    }

    public List<Sereno> getLstSerenos() {
        return lstSerenos;
    }

    public void setLstSerenos(List<Sereno> lstSerenos) {
        this.lstSerenos = lstSerenos;
    }

    public LazyDataModel<SerenoPerro> getSerenosperros() {
        return serenosperros;
    }

    public void setSerenosperros(LazyDataModel<SerenoPerro> serenosperros) {
        this.serenosperros = serenosperros;
    }

    public SerenoPerro getSp() {
        return sp;
    }

    public void setSp(SerenoPerro sp) {
        this.sp = sp;
    }

    public SerenoPerro getSpcaptura() {
        return spcaptura;
    }

    public void setSpcaptura(SerenoPerro spcaptura) {
        this.spcaptura = spcaptura;
    }

    public List<Sereno> getLstSerenosu() {
        return lstSerenosu;
    }

    public void setLstSerenosu(List<Sereno> lstSerenosu) {
        this.lstSerenosu = lstSerenosu;
    }

    public List<Perro> getLstPerrosu() {
        return lstPerrosu;
    }

    public void setLstPerrosu(List<Perro> lstPerrosu) {
        this.lstPerrosu = lstPerrosu;
    }

    public boolean isEstadoupdate() {
        return estadoupdate;
    }

    public void setEstadoupdate(boolean estadoupdate) {
        this.estadoupdate = estadoupdate;
    }

    public Sereno getSereno2() {
        return sereno2;
    }

    public void setSereno2(Sereno sereno2) {
        this.sereno2 = sereno2;
    }

    public Perro getPerro2() {
        return perro2;
    }

    public void setPerro2(Perro perro2) {
        this.perro2 = perro2;
    }

    public String getNombreSereno() {
        return nombreSereno;
    }

    public void setNombreSereno(String nombreSereno) {
        this.nombreSereno = nombreSereno;
    }

    public String getNombrePerro() {
        return nombrePerro;
    }

    public void setNombrePerro(String nombrePerro) {
        this.nombrePerro = nombrePerro;
    }

}
